package com.justnow.offer;

/**
 * @author justnow
 * Created on 2020-08-13
 * Description
 */
public class Solution67 {
    public static int strToInt(String str) {
        char[] chars = str.trim().toCharArray();
        if (chars.length == 0) return 0;
        int res = 0, boundry = Integer.MAX_VALUE / 10, threshold = Integer.MAX_VALUE % 10;
        int i = 1, sign = 1;
        if (chars[0] == '-') sign = -1;
        else if (chars[0] != '+') i = 0;
        for (int j = i; j < chars.length; j++) {
            //直接break，说明出现了非整数字符，当然也判断了字符串的第一位。
            if (chars[j] < '0' || chars[j] > '9') break;
            //超过边界分为两种情况：
            //Integer.MAX_VALUE = 2147483646, Integer.MIN_VALUE = -2147483648
            //1. 当进行添加的res大于21474836时，说明肯定要过界了，按照之前返回的sign来判断最大和最小值
            //2. 当进行添加的res等于21474836，此时就要判断chars[j]和Integer.MAX_VALUE的最后一位的大小了，如果大的话，说明过界了
            //此时的疑惑的点是，在上述情况下，chars[j] = 8,并且sign为-1时，此时不是不过界吗，这种情况因为直接就是Integer.MIN_VALUE，下面返回的就是最下的值
            if (res > boundry || res == boundry && chars[j] > ('0' + threshold))
                return sign == 1 ? Integer.MAX_VALUE : Integer.MIN_VALUE;
            //如果没有break或者return的话
            //可分为：
            //1. chars[i]可以继续添加
            //2. chass[i]为空
            res = res * 10 + (chars[j] - '0');
        }
        return sign * res;
    }

    public static void main(String[] args) {

        int i = Solution67.strToInt("2147483646");
        System.out.println(i);
        System.out.println(Integer.MIN_VALUE);
        System.out.println(Integer.MAX_VALUE % 10);
    }
}
